#不同页面的测试我们使用不同的脚本文件
from selenium.common.exceptions import TimeoutException, NoAlertPresentException
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions
from selenium.webdriver.support.wait import WebDriverWait

from common.tool import BlogDriver #明确，BlogDriver对象支持被导入，本质是因为它是一个模块对象，即它的作用域属于模块全局，即python支持导入模块、类之外，还支持导入具有模块属性的函数、变量、对象等（模块属性也就是全局）

#这里标明一下python的作用域
#全局作用域
class BlogLogin:
    #类内作用域（在类内作用域就可以定义成员变量和成员函数）
    url = ""
    driver = ""
    def __init__(self): #这里明确，python用前置下划线来区分公有和私有，__xxx即私有，xxx即公有，_xxx即保护
        #构造函数作用域
        self.url = "http://8.137.19.140:9090/blog_login.html"
        self.driver = BlogDriver.driver
        self.driver.get(self.url)

    #类内作用域
    #根据测试用例进行自动化测试
    #成功登录测试用例
    def LoginSuccessTest(self):
        self.driver.find_element(By.CSS_SELECTOR, "#username").send_keys("zhangsan")
        self.driver.find_element(By.CSS_SELECTOR, "#password").send_keys("123456")
        self.driver.find_element(By.CSS_SELECTOR, "#submit").click()
        #测试数据和测试操作明确之后，就是预期结果，因此对于自动化测试而言，此时就需要对预期结果进行操作，可以是查找预期结果出现的控件，也可以是assert
        self.driver.find_element(By.XPATH, "/html/body/div[2]/div[1]/div/h3")
        #self.driver.find_element(By.CSS_SELECTOR, "body > div.container > div.left > div > h3")

        #测试完毕之后，一般都需要添加当前截图
        BlogDriver.saveScreenShot()

        self.driver.back()

    #异常登录测试用例
    def LoginFailedTest(self):
        self.driver.find_element(By.CSS_SELECTOR, "#username").clear()
        self.driver.find_element(By.CSS_SELECTOR, "#username").send_keys("zhangsan")
        self.driver.find_element(By.CSS_SELECTOR, "#password").clear()
        self.driver.find_element(By.CSS_SELECTOR, "#password").send_keys("错误的密码")
        self.driver.find_element(By.CSS_SELECTOR, "#submit").click()
        #预期：出现提示密码错误的弹窗，因此此时就需要通过弹窗提示来明确结果（此时一定要使用显示等待）
        try:
            alter = WebDriverWait(self.driver, 5).until(expected_conditions.alert_is_present())#until决定等待条件是什么返回值就是什么
            #因此此时发现，弹窗一般不能直接切换，而应该用显示等待，当然这里可以把抛异常加上
            assert(alter.text == "密码错误")
            alter.accept()
            #同理添加屏幕截图
            BlogDriver.saveScreenShot()
        #异常处理（用的是selenium提供的TimeoutException和NoAlertPresentException类，当然AssertionError是python的内置方法表示抛出一个断言）
        except TimeoutException:
            raise AssertionError("点击登录后未出现原生弹窗，且未处理自定义弹窗")
        except NoAlertPresentException:
            raise AssertionError("未检测到任何弹窗")


    #还有其它测试用例，同理








